import axios from 'axios'
import Vue from 'vue'
import {
	MessageBox,
	Message
} from 'element-ui'
import store from '@/store'
let service_url = '', //请求ip
	service //请求对象
if (process.env.NODE_ENV == 'development') {
	startApp("DEV_URL") //开发模式
} else {
	startApp("BUILD_URL") //生成模式
}
//获取配置文件
async function startApp(url_type) {
	// let data
	// if (url_type == 'DEV_URL') {
	// 	data = await axios.get('../config/config.json')
	// 	service_url = data.data.DEV_URL
	// } else {
	// 	data = await axios.get('./config/config.json') //此路径是相对于服务器的路径
	// 	service_url = data.data.BUILD_URL
	// }
	// console.log('BUILD_URL',data.data.BUILD_URL);
	// console.log('image_serve',data.data.image_serve);
	// console.log('emoji_server',data.data.emoji_server);
	// store.getters.api.host_serve=data.data.host_serve
	// store.getters.api.image_serve=data.data.image_serve
	// store.getters.api.wps_serve=data.data.wps_serve
	// store.getters.api.webSocket_serve=data.data.webSocket_serve
	// store.getters.api.emoji_server=data.data.emoji_server//表情地址
	
	
	
	// 创建实例
	service = axios.create({
		baseURL: service_url, // url = base url + request url
		// withCredentials: true, // send cookies when cross-domain requests
		timeout: 60000, // request timeout
		headers: {
			'Content-Type': 'application/json' //转换data展现形式
		},
	})

	//请求拦截器
	service.interceptors.request.use(
		config => {
			config.headers['Authorization'] = localStorage.getItem('token')
			return config
		},
		error => {
			// do something with request error
			console.log(error) // for debug
			return Promise.reject(error)
		}
	)

	//响应拦截器
	service.interceptors.response.use(
		/**
		 * If you want to get http information such as headers or status
		 * Please return  response => response
		 */

		/**
		 * Determine the request status by custom code
		 * Here is just an example
		 * You can also judge the status by HTTP Status Code
		 */
		response => {
			const res = response.data
			// if the custom code is not 20000, it is judged as an error.
			if (res.code !== 0 && res.code !== 200) {
				Message({
					message: res.msg || 'Error',
					type: 'error',
					duration: 5 * 1000
				})

				// 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
				if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
					// to re-login
					MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again',
						'Confirm logout', {
							confirmButtonText: 'Re-Login',
							cancelButtonText: 'Cancel',
							type: 'warning'
						}).then(() => {
						store.dispatch('user/resetToken').then(() => {
							location.reload()
						})
					})
				}
				if (res.code == 400) {
					// store.dispatch('user/resetToken').then(() => {
					// 	location.reload()
					// })
				}
				return Promise.reject(new Error(res.msg || 'Error'))
			} else {
				return res
			}
		},
		error => {
			console.log('err' + error) // for debug
			Message({
				message: error.message,
				type: 'error',
				duration: 5 * 1000
			})
			return Promise.reject(error)
		}
	)
}



//请求接口
function doGet(url, req, successCallback, errorCallback) {
	let $message
	if(service&&req.showLoading){
		$message = Message({
		  message: `正在加载中...`,
		  type: 'warning',
		  duration: 0,
		  iconClass: 'el-icon-loading'
		})
	}
	return new Promise((result, rejec) => {
		service({
			url: url,
			method: 'get',
			params: req
		}).then((response) => {
			try{
				$message.close()
			}catch(e){
				//TODO handle the exception
			}
			result(response)
			successCallback && successCallback(response);
		}).catch((err) => {
			try{
				$message.close()
			}catch(e){
				//TODO handle the exception
			}
			rejec(err)
			errorCallback && errorCallback(err);
		})
		
	})
}

function doPost(url, req, successCallback, errorCallback) {
	let $message
	if(service&&req.showLoading){
		$message = Message({
		  message: `正在加载中...`,
		  type: 'warning',
		  duration: 0,
		  iconClass: 'el-icon-loading'
		})
	}
	return new Promise((result, rejec) => {
		console.log(url,req);
		service({
			url: url,
			method: 'post',
			data: req,
			// transformRequest: [function(data) { //允许在向服务器发送前，修改请求数据
			// 	let ret = ''
			// 	for (let it in data) {
			// 		ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
			// 	}
			// 	return ret
			// }],
		}).then((response) => {
			try{
				$message.close()
			}catch(e){
				//TODO handle the exception
			}
			result(response)
			successCallback && successCallback(response);
		}).catch((err) => {
			try{
				$message.close()
			}catch(e){
				//TODO handle the exception
			}
			rejec(err)
			errorCallback && errorCallback(err);
		})
	})
}
//附件上传
function doUpload(url, req, successCallback, errorCallback) {
	return new Promise((result, rejec) => {
		service({
			url: url,
			method: 'post',
			data: req,
			headers: {
				"Content-Type": "multipart/form-data"
			},
			onUploadProgress: progressEvent => {
				let complete = (progressEvent.loaded / progressEvent.total * 100 | 0)
				successCallback && successCallback(complete)
			}
		}).then((response) => {
			result(response)
			successCallback && successCallback(response);
		}).catch((err) => {
			rejec(err)
			errorCallback && errorCallback(err);
		})
	})
}

function doDelete(url, req, successCallback, errorCallback) {
	return new Promise((result, rejec) => {
		service({
			url: url,
			method: 'delete',
			data: req
		}).then((response) => {
			result(response)
			successCallback && successCallback(response);
		}).catch((err) => {
			rejec(err)
			errorCallback && errorCallback(err);
		})
	})
}

//工具
import htmlUtil from './function/htmlUtil.js'
import file from './function/file.js'
import cursor from './function/cursor.js'
import guid from './function/guid.js'
import timeFormat from './function/timeFormat.js'
import webSocket from './function/webSocket.js'
import electronStore from './function/store.js'
import lzByte from './function/byte.js'
import getTime from './function/getTime.js'
import lzfs from './function/fs.js'
electronStore.initStore()
electronStore.initDB()
import debounce from './function/debounce.js'

const $lizhao = {
	htmlUtil, //富文本编码操作
	file, //文件操作
	cursor, //光标操作
	guid,//获取uuid
	timeFormat,//格式化时间
	webSocket,//socket连接通信
	lzByte,
	debounce,//防抖
	getTime,//获取前几天或后几天日期
	lzfs,//文件操作
}

Vue.prototype.$lizhao = $lizhao

export default {
	doGet: doGet,
	doPost: doPost,
	doDelete: doDelete,
	doUpload: doUpload
}
